package com.itheima.a11;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.Arrays;

public class CglibProxyDemo {

    static class Target {
        public void foo() {
            System.out.println("target foo");
        }
    }

    // 代理是子类型, 目标是父类型
    public static void main(String[] param) {
        Target target = new Target();

        Target proxy = (Target) Enhancer.create(Target.class, new MethodInterceptor() {
            //p-代理对象自己
            //method-方法(java.lang.reflect)
            //args-方法参数
            //methodProxy-方法(org.springframework.cglib.proxy)
            @Override
            public Object intercept(Object p, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println("before...");
                // Object result = method.invoke(target, args); // 用方法反射调用目标

                // methodProxy 它可以避免反射调用
                // Object result = methodProxy.invoke(target, args); // 内部没有用反射, 需要目标 （spring）
                Object result = methodProxy.invokeSuper(p, args); // 内部没有用反射, 需要代理
                System.out.println("after...");
                return result;
            }
        });

        proxy.foo();
    }
}